#include "ScanFile.h"
#include "Exception.h"
#include <windows.h>

/**
Constructeur
*/
ScanFile::ScanFile(void)
{
}

/**
Destructeur
*/
ScanFile::~ScanFile(void)
{
	_it = _list.begin();
	while ( _it != _list.end() )
	{
		delete (*_it);
		_it++;
	}
}

/**
Scan un repertoire avec un filtre
@param[in]	path repertoire a scanner
@param[in]	filter	filtre du scan
*/
void ScanFile::scan( const std::wstring& path,
					const std::wstring& filter )
{
	WIN32_FIND_DATA FindFileData;
	HANDLE hFind;

	std::wstring tmp = path + L"*" /*+ filter*/;
	hFind = ::FindFirstFile( tmp.c_str(), &FindFileData);

	if ( hFind == INVALID_HANDLE_VALUE )
	{
		throw Exception(L"Path error");
		return ;
	}

	do
	{
		std::wstring filename = FindFileData.cFileName;
		if ( filename == TEXT(".") )
			continue;
		if ( filename == TEXT("..") )
			continue;
		if ( FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )
			int toDel = 0;
			//scan( path + filename + TEXT("\\"), filter );		
		else {
			File *pFile = new File(path,filename);
			if ( pFile->getExtention() == L".mp3" ) //TODO: icase 
				_list.push_back( pFile );
			else
				delete pFile;
		}

	} while ( ::FindNextFile(hFind, &FindFileData) != 0 );	
	_it = _list.begin();
}

/**
@return le nombre de fichier trouve
*/
int ScanFile::getNbFile() const
{
	return _list.size();
}

/**
@param[in]	id	identifiant
@return un fichier a l'aide de son identifiant
*/
File* ScanFile::getFile(const int id)
{
	return _list.at(id);
}

/**
Scan et lit le premier fichier 
de la liste
*/
void ScanFile::play()
{
	(*_it)->scan();
	(*_it)->play();
}

/**
@return le fichier courant
*/
File* ScanFile::getCurFile()
{
	return (*_it);
}

/**
Stop la lecture du fichier courant
et lit le fichier suivant
*/
void ScanFile::next()
{
	(*_it)->stop();
	_it++;
	play();
}